package com.wyw.function.learning.demo9;

import java.util.concurrent.*;

/**
 * @Title   组合式异步编程
 * @Description
 * @Author Mr Wu yewen.wu.china@gmail.com
 * Update History:
 * Author        Time            Content
 */
public class DemoClient21 {

    /**
     * 使用Future
     *
     *      Future接口的局限性：当产生过hi见计算任务完成时，请将该计算的结果通知到另一个长时间运行的计算任务，当两个计算任务都完成后，将计算的结果与临海一个查询操作结果合并。
     */
    public static void main(String[] args) {

        ExecutorService service = Executors.newCachedThreadPool();
        Future<Double> future = service.submit(new Callable<Double>() {
            @Override
            public Double call() throws Exception {
                return doSomeThingComputation();
            }
        });
        doSomeThingElse();

        try {
            Double num = future.get();// 如果长时间没有查询到执行结果，就会阻塞，Future提供了无需任务参数的get方法，但是推荐使用重载方法，接收一个超时参数
            System.out.println(num);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        service.shutdown();

    }

    private static Double doSomeThingComputation() {
        try {
            Thread.sleep(2 * 1000);
            System.out.println("method1 doSomeThingComputation");
            return 2D;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 1D;
    }

    private static void doSomeThingElse() {
        try {
            Thread.sleep(1 * 1000);
            System.out.println("method2 doSomeThingElse");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
